package io.byte_stream;

import java.io.FileInputStream;
import java.io.IOException;

/*
1.概念
IO流用来处理设备之间的数据传输
    Java对数据的操作是通过流的方式
    Java用于操作流的类都在IO包中
流按流向分为两种：输入流，输出流。
流按操作类型分为两种：
字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的
字符流 : 字符流只能操作纯字符数据，比较方便。
2.IO流常用父类
 字节流的抽象父类：
    InputStream
    OutputStream
 字符流的抽象父类：
    Reader
    Writer
3.IO程序书写
    使用前，导入IO包中的类
    使用时，进行IO异常处理
    使用后，释放资源
 */
public class Demo01_FileInputStream {
    public static void main(String[] args) throws IOException {
        //extracted();
        FileInputStream fileInputStream = new FileInputStream("wzx.txt");
        //定义变量，记录每次读到的字节
        int reads;

        while ((reads = fileInputStream.read()) != -1) {//将每次读到的字节赋值给reads，判断是否为-1
            System.out.println(reads);//打印每一个字节
        }
        fileInputStream.close();//关闭流释放资源

        /*
        read()方法读取的是一个字节，为什么返回值是int，而不是byte?

            因为字节输入流可以操作任意类型的文件,比如图片音频等,
            这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,
            有可能在读到中间的时候遇到111111111
            那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,
            后面的数据就读不到了,所以在读取的时候用int类型接收,
            如果11111111会在其前面补上
            24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,
            而结束标记的-1就是int类型
         */

    }

    private static void extracted() throws IOException {
        //创建流对象
        FileInputStream fileInputStream = new FileInputStream("wzx.txt");

        //read():从硬盘上读取一个字节
        int read = fileInputStream.read();
        System.out.println(read);
        int read2 = fileInputStream.read();
        System.out.println(read2);
        int read3 = fileInputStream.read();
        System.out.println(read3);

        //关流释放资源
        fileInputStream.close();
    }
}
